<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />

<meta name="viewport" content="width=device-width, initial-scale=1" />

<meta name="author" content="Korsunsky et al.: Fast, sensitive, and accurate integration of single cell data with Harmony" />


<title>Quick start to Harmony</title>

<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
// be compatible with the behavior of Pandoc < 2.8).
document.addEventListener('DOMContentLoaded', function(e) {
  var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
  var i, h, a;
  for (i = 0; i < hs.length; i++) {
    h = hs[i];
    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6
    a = h.attributes;
    while (a.length > 0) h.removeAttribute(a[0].name);
  }
});
</script>
<style type="text/css">detaiks.chunk-details > summary.chunk-summary {
text-align: right;
}
details.chunk-details[open] > summary.chunk-summary::after {
content: "Hide";
}
details.chunk-details[open] > summary.chunk-summary > span.chunk-summary-text {
display: none;
}
</style>

<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
</style>



<style type="text/css">
code {
white-space: pre;
}
.sourceCode {
overflow: visible;
}
</style>
<style type="text/css" data-origin="pandoc">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } 
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } 
code span.at { color: #7d9029; } 
code span.bn { color: #40a070; } 
code span.bu { color: #008000; } 
code span.cf { color: #007020; font-weight: bold; } 
code span.ch { color: #4070a0; } 
code span.cn { color: #880000; } 
code span.co { color: #60a0b0; font-style: italic; } 
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } 
code span.do { color: #ba2121; font-style: italic; } 
code span.dt { color: #902000; } 
code span.dv { color: #40a070; } 
code span.er { color: #ff0000; font-weight: bold; } 
code span.ex { } 
code span.fl { color: #40a070; } 
code span.fu { color: #06287e; } 
code span.im { color: #008000; font-weight: bold; } 
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } 
code span.kw { color: #007020; font-weight: bold; } 
code span.op { color: #666666; } 
code span.ot { color: #007020; } 
code span.pp { color: #bc7a00; } 
code span.sc { color: #4070a0; } 
code span.ss { color: #bb6688; } 
code span.st { color: #4070a0; } 
code span.va { color: #19177c; } 
code span.vs { color: #4070a0; } 
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } 
</style>
<script>
// apply pandoc div.sourceCode style to pre.sourceCode instead
(function() {
  var sheets = document.styleSheets;
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue;
    try { var rules = sheets[i].cssRules; } catch (e) { continue; }
    var j = 0;
    while (j < rules.length) {
      var rule = rules[j];
      // check if there is a div.sourceCode rule
      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") {
        j++;
        continue;
      }
      var style = rule.style.cssText;
      // check if color or background-color is set
      if (rule.style.color === '' && rule.style.backgroundColor === '') {
        j++;
        continue;
      }
      // replace div.sourceCode by a pre.sourceCode rule
      sheets[i].deleteRule(j);
      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);
    }
  }
})();
</script>




<style type="text/css">body {
background-color: #fff;
margin: 1em auto;
max-width: 700px;
overflow: visible;
padding-left: 2em;
padding-right: 2em;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.35;
}
#TOC {
clear: both;
margin: 0 0 10px 10px;
padding: 4px;
width: 400px;
border: 1px solid #CCCCCC;
border-radius: 5px;
background-color: #f6f6f6;
font-size: 13px;
line-height: 1.3;
}
#TOC .toctitle {
font-weight: bold;
font-size: 15px;
margin-left: 5px;
}
#TOC ul {
padding-left: 40px;
margin-left: -1.5em;
margin-top: 5px;
margin-bottom: 5px;
}
#TOC ul ul {
margin-left: -2em;
}
#TOC li {
line-height: 16px;
}
table {
margin: 1em auto;
border-width: 1px;
border-color: #DDDDDD;
border-style: outset;
border-collapse: collapse;
}
table th {
border-width: 2px;
padding: 5px;
border-style: inset;
}
table td {
border-width: 1px;
border-style: inset;
line-height: 18px;
padding: 5px 5px;
}
table, table th, table td {
border-left-style: none;
border-right-style: none;
}
table thead, table tr.even {
background-color: #f7f7f7;
}
p {
margin: 0.5em 0;
}
blockquote {
background-color: #f6f6f6;
padding: 0.25em 0.75em;
}
hr {
border-style: solid;
border: none;
border-top: 1px solid #777;
margin: 28px 0;
}
dl {
margin-left: 0;
}
dl dd {
margin-bottom: 13px;
margin-left: 13px;
}
dl dt {
font-weight: bold;
}
ul {
margin-top: 0;
}
ul li {
list-style: circle outside;
}
ul ul {
margin-bottom: 0;
}
pre, code {
background-color: #f7f7f7;
border-radius: 3px;
color: #333;
white-space: pre-wrap; 
}
pre {
border-radius: 3px;
margin: 5px 0px 10px 0px;
padding: 10px;
}
pre:not([class]) {
background-color: #f7f7f7;
}
code {
font-family: Consolas, Monaco, 'Courier New', monospace;
font-size: 85%;
}
p > code, li > code {
padding: 2px 0px;
}
div.figure {
text-align: center;
}
img {
background-color: #FFFFFF;
padding: 2px;
border: 1px solid #DDDDDD;
border-radius: 3px;
border: 1px solid #CCCCCC;
margin: 0 5px;
}
h1 {
margin-top: 0;
font-size: 35px;
line-height: 40px;
}
h2 {
border-bottom: 4px solid #f7f7f7;
padding-top: 10px;
padding-bottom: 2px;
font-size: 145%;
}
h3 {
border-bottom: 2px solid #f7f7f7;
padding-top: 10px;
font-size: 120%;
}
h4 {
border-bottom: 1px solid #f7f7f7;
margin-left: 8px;
font-size: 105%;
}
h5, h6 {
border-bottom: 1px solid #ccc;
font-size: 105%;
}
a {
color: #0033dd;
text-decoration: none;
}
a:hover {
color: #6666ff; }
a:visited {
color: #800080; }
a:visited:hover {
color: #BB00BB; }
a[href^="http:"] {
text-decoration: underline; }
a[href^="https:"] {
text-decoration: underline; }

code > span.kw { color: #555; font-weight: bold; } 
code > span.dt { color: #902000; } 
code > span.dv { color: #40a070; } 
code > span.bn { color: #d14; } 
code > span.fl { color: #d14; } 
code > span.ch { color: #d14; } 
code > span.st { color: #d14; } 
code > span.co { color: #888888; font-style: italic; } 
code > span.ot { color: #007020; } 
code > span.al { color: #ff0000; font-weight: bold; } 
code > span.fu { color: #900; font-weight: bold; } 
code > span.er { color: #a61717; background-color: #e3d2d2; } 
</style>




</head>

<body>




<h1 class="title toc-ignore">Quick start to Harmony</h1>
<h4 class="author">Korsunsky et al.: Fast, sensitive, and accurate
integration of single cell data with Harmony</h4>



<div id="introduction" class="section level1">
<h1>Introduction</h1>
<p>Harmony is an algorithm for performing integration of single cell
genomics datasets. Please check out our latest <a href="https://www.nature.com/articles/s41592-019-0619-0">manuscript on
Nature Methods</a>.</p>
<p><img src="" style="width:100.0%" /></p>
</div>
<div id="installation" class="section level1">
<h1>Installation</h1>
<p>Install Harmony from CRAN with standard commands.</p>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="fu">install.packages</span>(<span class="st">&#39;harmony&#39;</span>)</span></code></pre></div>
</details>
<p>Once Harmony is installed, load it up!</p>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" tabindex="-1"></a><span class="fu">library</span>(harmony)</span></code></pre></div>
</details>
</div>
<div id="integrating-cell-line-datasets-from-10x" class="section level1">
<h1>Integrating cell line datasets from 10X</h1>
<p>The example below follows Figure 2 in the manuscript.</p>
<p>We downloaded 3 cell line datasets from the 10X website. The first
two (jurkat and 293t) come from pure cell lines while the <em>half</em>
dataset is a 50:50 mixture of Jurkat and HEK293T cells. We inferred cell
type with the canonical marker XIST, since the two cell lines come from
1 male and 1 female donor.</p>
<ul>
<li>support.10xgenomics.com/single-cell-gene-expression/datasets/1.1.0/jurkat</li>
<li>support.10xgenomics.com/single-cell-gene-expression/datasets/1.1.0/293t</li>
<li>support.10xgenomics.com/single-cell-gene-expression/datasets/1.1.0/jurkat:293t_50:50</li>
</ul>
<p>We library normalized the cells, log transformed the counts, and
scaled the genes. Then we performed PCA and kept the top 20 PCs. The PCA
embeddings and meta data are available as part of this package.</p>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1" tabindex="-1"></a><span class="fu">data</span>(cell_lines)</span>
<span id="cb3-2"><a href="#cb3-2" tabindex="-1"></a>V <span class="ot">&lt;-</span> cell_lines<span class="sc">$</span>scaled_pcs</span>
<span id="cb3-3"><a href="#cb3-3" tabindex="-1"></a>meta_data <span class="ot">&lt;-</span> cell_lines<span class="sc">$</span>meta_data</span></code></pre></div>
</details>
<p>Initially, the cells cluster by both dataset (left) and cell type
(right).</p>
<details class="chunk-details"><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb4"><pre class="sourceCode r fold-hide"><code class="sourceCode r"><span id="cb4-1"><a href="#cb4-1" tabindex="-1"></a><span class="fu">library</span>(ggplot2)</span>
<span id="cb4-2"><a href="#cb4-2" tabindex="-1"></a></span>
<span id="cb4-3"><a href="#cb4-3" tabindex="-1"></a>do_scatter <span class="ot">&lt;-</span> <span class="cf">function</span>(xy, meta_data, label_name, <span class="at">base_size =</span> <span class="dv">12</span>) {    </span>
<span id="cb4-4"><a href="#cb4-4" tabindex="-1"></a>    palette_use <span class="ot">&lt;-</span> <span class="fu">c</span>(<span class="st">`</span><span class="at">jurkat</span><span class="st">`</span> <span class="ot">=</span> <span class="st">&#39;#810F7C&#39;</span>, <span class="st">`</span><span class="at">t293</span><span class="st">`</span> <span class="ot">=</span> <span class="st">&#39;#D09E2D&#39;</span>,<span class="st">`</span><span class="at">half</span><span class="st">`</span> <span class="ot">=</span> <span class="st">&#39;#006D2C&#39;</span>)</span>
<span id="cb4-5"><a href="#cb4-5" tabindex="-1"></a>    xy <span class="ot">&lt;-</span> xy[, <span class="dv">1</span><span class="sc">:</span><span class="dv">2</span>]</span>
<span id="cb4-6"><a href="#cb4-6" tabindex="-1"></a>    <span class="fu">colnames</span>(xy) <span class="ot">&lt;-</span> <span class="fu">c</span>(<span class="st">&#39;X1&#39;</span>, <span class="st">&#39;X2&#39;</span>)</span>
<span id="cb4-7"><a href="#cb4-7" tabindex="-1"></a>    plt_df <span class="ot">&lt;-</span> xy <span class="sc">%&gt;%</span> <span class="fu">data.frame</span>() <span class="sc">%&gt;%</span> <span class="fu">cbind</span>(meta_data)</span>
<span id="cb4-8"><a href="#cb4-8" tabindex="-1"></a>    plt <span class="ot">&lt;-</span> <span class="fu">ggplot</span>(plt_df, <span class="fu">aes</span>(X1, X2, <span class="at">col =</span> <span class="sc">!!</span>rlang<span class="sc">::</span><span class="fu">sym</span>(label_name), <span class="at">fill =</span> <span class="sc">!!</span>rlang<span class="sc">::</span><span class="fu">sym</span>(label_name))) <span class="sc">+</span> </span>
<span id="cb4-9"><a href="#cb4-9" tabindex="-1"></a>        <span class="fu">theme_test</span>(<span class="at">base_size =</span> base_size) <span class="sc">+</span></span>
<span id="cb4-10"><a href="#cb4-10" tabindex="-1"></a>        <span class="fu">guides</span>(<span class="at">color =</span> <span class="fu">guide_legend</span>(<span class="at">override.aes =</span> <span class="fu">list</span>(<span class="at">stroke =</span> <span class="dv">1</span>, <span class="at">alpha =</span> <span class="dv">1</span>,</span>
<span id="cb4-11"><a href="#cb4-11" tabindex="-1"></a>                                                        <span class="at">shape =</span> <span class="dv">16</span>, <span class="at">size =</span> <span class="dv">4</span>))) <span class="sc">+</span></span>
<span id="cb4-12"><a href="#cb4-12" tabindex="-1"></a>        <span class="fu">scale_color_manual</span>(<span class="at">values =</span> palette_use) <span class="sc">+</span></span>
<span id="cb4-13"><a href="#cb4-13" tabindex="-1"></a>        <span class="fu">scale_fill_manual</span>(<span class="at">values =</span> palette_use) <span class="sc">+</span></span>
<span id="cb4-14"><a href="#cb4-14" tabindex="-1"></a>        <span class="fu">theme</span>(<span class="at">plot.title =</span> <span class="fu">element_text</span>(<span class="at">hjust =</span> .<span class="dv">5</span>)) <span class="sc">+</span></span>
<span id="cb4-15"><a href="#cb4-15" tabindex="-1"></a>        <span class="fu">labs</span>(<span class="at">x =</span> <span class="st">&quot;PC 1&quot;</span>, <span class="at">y =</span> <span class="st">&quot;PC 2&quot;</span>) <span class="sc">+</span></span>
<span id="cb4-16"><a href="#cb4-16" tabindex="-1"></a>        <span class="fu">theme</span>(<span class="at">legend.position =</span> <span class="st">&quot;none&quot;</span>) <span class="sc">+</span></span>
<span id="cb4-17"><a href="#cb4-17" tabindex="-1"></a>        <span class="fu">geom_point</span>(<span class="at">shape =</span> <span class="st">&#39;.&#39;</span>)</span>
<span id="cb4-18"><a href="#cb4-18" tabindex="-1"></a>    </span>
<span id="cb4-19"><a href="#cb4-19" tabindex="-1"></a>    <span class="do">## Add labels</span></span>
<span id="cb4-20"><a href="#cb4-20" tabindex="-1"></a>    data_labels <span class="ot">&lt;-</span> plt_df <span class="sc">%&gt;%</span></span>
<span id="cb4-21"><a href="#cb4-21" tabindex="-1"></a>        dplyr<span class="sc">::</span><span class="fu">group_by</span>(<span class="sc">!!</span>rlang<span class="sc">::</span><span class="fu">sym</span>(label_name)) <span class="sc">%&gt;%</span></span>
<span id="cb4-22"><a href="#cb4-22" tabindex="-1"></a>        dplyr<span class="sc">::</span><span class="fu">summarise</span>(<span class="at">X1 =</span> <span class="fu">mean</span>(X1), <span class="at">X2 =</span> <span class="fu">mean</span>(X2)) <span class="sc">%&gt;%</span></span>
<span id="cb4-23"><a href="#cb4-23" tabindex="-1"></a>        dplyr<span class="sc">::</span><span class="fu">ungroup</span>()</span>
<span id="cb4-24"><a href="#cb4-24" tabindex="-1"></a>    plt <span class="sc">+</span> <span class="fu">geom_label</span>(<span class="at">data =</span> data_labels, <span class="fu">aes</span>(<span class="at">label =</span> <span class="sc">!!</span>rlang<span class="sc">::</span><span class="fu">sym</span>(label_name)), </span>
<span id="cb4-25"><a href="#cb4-25" tabindex="-1"></a>                            <span class="at">color =</span> <span class="st">&quot;white&quot;</span>, <span class="at">size =</span> <span class="dv">4</span>)</span>
<span id="cb4-26"><a href="#cb4-26" tabindex="-1"></a>}</span>
<span id="cb4-27"><a href="#cb4-27" tabindex="-1"></a>p1 <span class="ot">&lt;-</span> <span class="fu">do_scatter</span>(V, meta_data, <span class="st">&#39;dataset&#39;</span>) <span class="sc">+</span> </span>
<span id="cb4-28"><a href="#cb4-28" tabindex="-1"></a>    <span class="fu">labs</span>(<span class="at">title =</span> <span class="st">&#39;Colored by dataset&#39;</span>)</span>
<span id="cb4-29"><a href="#cb4-29" tabindex="-1"></a>p2 <span class="ot">&lt;-</span> <span class="fu">do_scatter</span>(V, meta_data, <span class="st">&#39;cell_type&#39;</span>) <span class="sc">+</span> </span>
<span id="cb4-30"><a href="#cb4-30" tabindex="-1"></a>    <span class="fu">labs</span>(<span class="at">title =</span> <span class="st">&#39;Colored by cell type&#39;</span>)</span>
<span id="cb4-31"><a href="#cb4-31" tabindex="-1"></a></span>
<span id="cb4-32"><a href="#cb4-32" tabindex="-1"></a>cowplot<span class="sc">::</span><span class="fu">plot_grid</span>(p1, p2)</span></code></pre></div>
</details>
<p><img src="" style="display: block; margin: auto;" /></p>
<p>Let’s run Harmony to remove the influence of dataset-of-origin from
the cell embeddings.</p>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1" tabindex="-1"></a>harmony_embeddings <span class="ot">&lt;-</span> harmony<span class="sc">::</span><span class="fu">RunHarmony</span>(</span>
<span id="cb5-2"><a href="#cb5-2" tabindex="-1"></a>    V, meta_data, <span class="st">&#39;dataset&#39;</span>, <span class="at">verbose=</span><span class="cn">FALSE</span></span>
<span id="cb5-3"><a href="#cb5-3" tabindex="-1"></a>)</span></code></pre></div>
</details>
<p>After Harmony, the datasets are now mixed (left) and the cell types
are still separate (right).</p>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb6"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb6-1"><a href="#cb6-1" tabindex="-1"></a>p1 <span class="ot">&lt;-</span> <span class="fu">do_scatter</span>(harmony_embeddings, meta_data, <span class="st">&#39;dataset&#39;</span>) <span class="sc">+</span> </span>
<span id="cb6-2"><a href="#cb6-2" tabindex="-1"></a>    <span class="fu">labs</span>(<span class="at">title =</span> <span class="st">&#39;Colored by dataset&#39;</span>)</span>
<span id="cb6-3"><a href="#cb6-3" tabindex="-1"></a>p2 <span class="ot">&lt;-</span> <span class="fu">do_scatter</span>(harmony_embeddings, meta_data, <span class="st">&#39;cell_type&#39;</span>) <span class="sc">+</span> </span>
<span id="cb6-4"><a href="#cb6-4" tabindex="-1"></a>    <span class="fu">labs</span>(<span class="at">title =</span> <span class="st">&#39;Colored by cell type&#39;</span>)</span>
<span id="cb6-5"><a href="#cb6-5" tabindex="-1"></a>cowplot<span class="sc">::</span><span class="fu">plot_grid</span>(p1, p2, <span class="at">nrow =</span> <span class="dv">1</span>)</span></code></pre></div>
</details>
<p><img src="" style="display: block; margin: auto;" /></p>
</div>
<div id="next-steps" class="section level1">
<h1>Next Steps</h1>
<div id="interfacing-to-software-packages" class="section level2">
<h2>Interfacing to software packages</h2>
<p>You can also run Harmony as part of an established pipeline in
several packages, such as Seurat. For these vignettes, please <a href="https://github.com/immunogenomics/harmony/">visit our github
page</a>.</p>
</div>
<div id="detailed-breakdown-of-the-harmony-algorithm" class="section level2">
<h2>Detailed breakdown of the Harmony algorithm</h2>
<p>For more details on how each part of Harmony works, consult our more
detailed <a href="https://htmlpreview.github.io/?https://github.com/immunogenomics/harmony/blob/master/doc/detailedWalkthrough.html">vignette</a>
“Detailed Walkthrough of Harmony Algorithm”.</p>
</div>
</div>
<div id="session-info" class="section level1">
<h1>Session Info</h1>
<details class="chunk-details" open><summary class="chunk-summary"><span class="chunk-summary-text">Code</span></summary>
<div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb7-1"><a href="#cb7-1" tabindex="-1"></a><span class="fu">sessionInfo</span>()</span></code></pre></div>
</details>
<pre><code>## R version 4.2.0 (2022-04-22)
## Platform: x86_64-conda-linux-gnu (64-bit)
## Running under: Arch Linux
## 
## Matrix products: default
## BLAS/LAPACK: /home/main/miniconda3/envs/Renv/lib/libopenblasp-r0.3.21.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] patchwork_1.2.0   harmony_1.2.1     Rcpp_1.0.12       ggrepel_0.9.3    
##  [5] ggthemes_4.2.4    lubridate_1.9.2   forcats_1.0.0     stringr_1.5.0    
##  [9] dplyr_1.1.4       purrr_1.0.2       readr_2.1.4       tidyr_1.3.0      
## [13] tibble_3.2.1      ggplot2_3.5.1     tidyverse_2.0.0   data.table_1.14.8
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1    xfun_0.40           bslib_0.4.2        
##  [4] lattice_0.20-45     colorspace_2.1-0    vctrs_0.6.5        
##  [7] generics_0.1.3      htmltools_0.5.6.1   yaml_2.3.7         
## [10] utf8_1.2.4          rlang_1.1.3         jquerylib_0.1.4    
## [13] pillar_1.9.0        glue_1.7.0          withr_3.0.0        
## [16] lifecycle_1.0.4     munsell_0.5.1       gtable_0.3.5       
## [19] codetools_0.2-19    evaluate_0.22       labeling_0.4.3     
## [22] knitr_1.42          tzdb_0.4.0          fastmap_1.1.1      
## [25] fansi_1.0.6         highr_0.10          scales_1.3.0       
## [28] cachem_1.0.7        jsonlite_1.8.7      farver_2.1.2       
## [31] RhpcBLASctl_0.23-42 hms_1.1.3           digest_0.6.33      
## [34] stringi_1.7.12      grid_4.2.0          cowplot_1.1.3      
## [37] cli_3.6.2           tools_4.2.0         magrittr_2.0.3     
## [40] sass_0.4.5          pkgconfig_2.0.3     Matrix_1.6-3       
## [43] timechange_0.2.0    rmarkdown_2.21      R6_2.5.1           
## [46] compiler_4.2.0</code></pre>
</div>



<!-- code folding -->


<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
  (function () {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src  = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
    document.getElementsByTagName("head")[0].appendChild(script);
  })();
</script>

</body>
</html>
